#include <sys/ucontext.h>
#include <ucontext.h>

typedef struct task_t {
	struct task_t *prev, *next;	//ponteiros para a tarefa anterior e seguinte
	int tid;					//identificador da tarefa
	char * stack_start;			//ponteiro para inicio da pilha
	ucontext_t context;			//contexto da tarefa (pilha e registradores LINUX)
} task_t;


void task_init();
	//maziero:
	//inicializa a biblioteca de funcoes de gerenciamento de tarefas
	//desativa o buffer
	//paulo:
	//inicializa o descritor (task_t) da tarefa principal
int task_create (task_t * task, void (*start_routine)(void *),  void * arg);
	//inicializa descritor (task_t) de tarefa
	//task aponta para o descritor da tarefa a ser criada
	//start_routine e o ponteiro para a funcao principal da tarefa
	//arg e' o argumento da funcao start_routine
	//retorna tid da tarefa criada ou valor negativo para erro
	//paulo:
	//reserva memoria para pilha
	//insere o descritor de tarefa na fila de tarefas prontas
int task_switch (task_t *task);
	//realiza chaveamento de contexto da tarefa corrente para task
	//task aponta para a tarefa a ser processada
	//retorna 0 para sucesso, -1 para erro
void task_exit (int exit_code);
	//retorna ao dispatcher, liberando as estruturas de dados
	//tirar tarefa em execuçãaao da fila ready_tasks
	//alterna de tarefa por task_switch
	//a tarefa retorna o codigo de saida (exit_code)
	//se o dispatcher chamar a função, ir para a tarefa principal
int task_id();
	//retorna o id da tarefa corrente (0 para main)
void task_yield ();
	//tarefa que fizer essa chamada continua na fila de tarefas prontas
	//libera a estrutura de dados
	//vai para o dispatcher por task_switch
task_t * scheduler ();
	//retorna o ponteiro para a tarefa a ser executada
	//política FCFS (first come, first served)